package tedu.cn;

import java.io.File;
import java.io.IOException;

import org.apache.lucene.analysis.cn.smart.SmartChineseAnalyzer;
import org.apache.lucene.document.Document;
import org.apache.lucene.document.Field.Store;
import org.apache.lucene.document.LongPoint;
import org.apache.lucene.document.StoredField;
import org.apache.lucene.document.TextField;
import org.apache.lucene.index.DirectoryReader;
import org.apache.lucene.index.IndexWriter;
import org.apache.lucene.index.IndexWriterConfig;
import org.apache.lucene.index.Term;
import org.apache.lucene.search.IndexSearcher;
import org.apache.lucene.search.ScoreDoc;
import org.apache.lucene.search.TermQuery;
import org.apache.lucene.search.TopDocs;
import org.apache.lucene.store.FSDirectory;
import org.junit.Test;

/**
 * 中文分词测试类
 * @author Administrator
 *
 */
public class Test1 {
	//测试用素材文档a
	String[] a = {
			"3, 华为 - 华为电脑, 爆款",
			"4, 华为手机, 旗舰",
			"5, 联想 - Thinkpad, 商务本",
			"6, 联想手机, 自拍神器"
	};
	/**
	 * 把a生成索引
	 * @throws IOException
	 */
	@Test
	public void test1() throws IOException {
		//指定文件夹d:/abc，存储索引文件的数据
		FSDirectory path = FSDirectory.open(new File("d:/abc").toPath());
		
		//通过配置来指定分词器SmartChineseAnalyzer
		IndexWriterConfig conf = new IndexWriterConfig(new  SmartChineseAnalyzer());
		
		//索引输出的工具
		IndexWriter writer=new IndexWriter(path, conf);
		
		//输出索引
		for (String s : a) {
			//拆分文档：3, 华为 - 华为电脑, 爆款，去掉逗号前后的空白字符
			/**
			 * 在其他语言中，\\ 表示：我想要在正则表达式中插入一个普通的（字面上的）反斜杠，请不要给它任何特殊的意义。
			 * 在 Java 中，\\ 表示：我要插入一个正则表达式的反斜线，所以其后的字符具有特殊的意义。
			 */
			String[] b = s.split("\\s*,\\s*");
			
			//文档数据要封装成Document对象中
			Document doc = new Document();
			doc.add(new  LongPoint("id", Long.parseLong(b[0])));//LongPoint没有Store.YES存储,所以要用下句来存储
			doc.add(new StoredField("id", Long.parseLong(b[0])));//存储id
			doc.add(new TextField("title", b[1], Store.YES));//Store.YES表存储,存储一些摘要,其字段为"title"
			doc.add(new TextField("sellPoint", b[2], Store.YES));//Store.YES表存储,存储一些摘要,其字段为"sellPoint"
			
			//将文档写入磁盘索引文件
			writer.addDocument(doc);
		}
		writer.close();
	}
	/**
	 * Lucene API从索引查询
	 * @throws Exception
	 */
	@Test
	public void test2() throws Exception {
		//索引数据的保存目录
		File path = new File("d:/abc");
		FSDirectory d = FSDirectory.open(path.toPath());
		//DirectoryReader是IndexReader的子类
		DirectoryReader reader = DirectoryReader.open(d);
		//创建搜索工具对象searcher,传入DirectoryReader对象reader
		IndexSearcher searcher = new IndexSearcher(reader);
		
		//关键词搜索器,我们搜索 "title:华为"
		TermQuery q = new TermQuery(new Term("title", "华为"));
		//执行查询,根据Score降序排序,返回前20条数据
		TopDocs docs = searcher.search(q, 20);

		//遍历查询到的结果文档并显示
		for (ScoreDoc doc : docs.scoreDocs) {
			//ScoreDoc封装着文档编号ScoreDoc.doc和文档得分ScoreDoc.score
			Document docId = searcher.doc(doc.doc);//取到当前文档doc的文档编号docId
			System.out.println(doc.score);
			//根据文档编号docId可以取得文档中的id和一些摘要
			System.out.println(docId.get("id"));
			System.out.println(docId.get("title"));
			System.out.println(docId.get("sellPoint"));
			System.out.println("--------------");
		}
	}
}
